<?php
/**
 * Game_Battle_Move
 *
 * Класс Game_Battle_Move отвечает за воинские передвижения
 *
 * @author Дмитрий Кузьма <kouzma.d@gmail.com>
 * @version 1.0
 */
class Game_Battle_Move {
	
	protected $_objPlaceSender; // место, из которого были отправлены войска
	protected $_objPlaceGoal; // место назначения
	protected $_objUserSender; // Пользователь, от которого идут войска
	protected $_objUserGoal; // Пользователь, к которому приходят войска
	
	protected $_objSentGroup; // Группа юнитов, которая была отправлена
	protected $_arrSentUnits = array(); // Юниты, которые были отправлены
	
	protected $_battleType; // тип сражения (это может быть и подкрепление)
	
	/**
	 * Задает место обороны
	 *
	 * @param Game_Place $objPlaceGoal
	 */
	public function setPlaceGoal(Game_Place $objPlaceGoal) {
		$this->_objPlaceGoal = $objPlaceGoal;
		$this->_objUserGoal = $this->_objPlaceGoal->getUser();
		$this->_objPlaceGoal->calculateAndUpdateDynamicConsumption();
	}
	
	/**
	 * Задает список атакующих юнитов
	 *
	 * @param Game_Unit_UnitsGroup $objUnitsGroup
	 */
	public function setSentGroup(Game_Unit_UnitsGroup $objSentGroup) {
		$this->_objSentGroup = $objSentGroup;
		$this->_arrSentUnits = $objSentGroup->getUnitsInGroup();
		$this->_objPlaceSender = new Game_Place($this->_objSentGroup->getField('ID_place_owner'));
		$this->_objPlaceSender->calculateAndUpdateDynamicConsumption();
		$this->_objUserSender = $this->_objPlaceSender->getUser();
	}
	
	/**
	 * Создает новый объект передвижения войск
	 *
	 * @param Game_Place $objPlaceGoal - место, в котором происходит сражение
	 * @param Game_Unit_UnitsGroup $objSentGroup - Группа атакующих войск
	 *
	 */
	public function __construct(Game_Place $objPlaceGoal, Game_Unit_UnitsGroup $objSentGroup) {
		$this->setPlaceGoal($objPlaceGoal);
		$this->setSentGroup($objSentGroup);
	}
	
	/**
	 * Сохраняет сущность битвы
	 *
	 * @return int - идентификатор битвы
	 */
	protected function _saveBattleEssence() {
		$objBattleEssence = new Game_Battle_Essence();
		$objBattleEssence->setField('battle_type', $this->_battleType);
		$objBattleEssence->setField('coord_1', $this->_objPlaceGoal->getField('coord_1'));
		$objBattleEssence->setField('coord_2', $this->_objPlaceGoal->getField('coord_2'));
		$objBattleEssence->save();
		return $objBattleEssence->id;
	}
	
	/**
	 * Сохраняет информацию о пользователях, участвоваших в битве
	 *
	 * @param int $battleId - идентификатор битвы для сохранения
	 */
	protected function _saveBattleUsersInfo($battleId) {
		$objBattleUser = new Game_Battle_User($this->_objUserSender->id, $battleId, 'attack');
		$objBattleUser->save();
	
		if ($this->_objUserSender->id != $this->_objUserGoal->id) {
			$objBattleUser = new Game_Battle_User($this->_objUserGoal->id, $battleId, 'own_defend');
			$objBattleUser->save();
		}
	}
	
	/**
	 * Сохраняет информацию о прошедшей битве
	 *
	 * @param int $battleId - идентификатор битвы для сохранения
	 */
	protected function _saveBattleUnitsInfo($battleId) {
		// Сохраянем данные об атакующем
		$stmtInsertStart = $this->_getInsertIntoBattleUnitStart();
		$stmtInsertValues = $this->_getSentUnitsToBattleUnitInsertValues($battleId);
		$objDb = Service_Database::instance();
		$arrUsers = $objDb->query($stmtInsertStart . $stmtInsertValues);
	}
	
	/**
	 * Получает начало запроса на вставку данных в таблицу battle_unit
	 */
	protected function _getInsertIntoBattleUnitStart() {
		return "INSERT INTO `battle_unit`
			(
				`ID_battle`, `ID_unit`, `ID_place`,
				`unit_side`, `amount`, `amount_died`
			)
			VALUES
		";
	}
	
	/**
	 * Получает подстроку для вставки перемещаемых юнитов в таблицу отчета
	 *
	 * @param int $battleId - идентификатор битвы для сохранения
	 */
	protected function _getSentUnitsToBattleUnitInsertValues($battleId) {
		$stmtInsertValues = "";
		$i = 0;
		foreach ($this->_arrSentUnits as $arrAttackerUnit) {
			if ($i++) $stmtInsertValues .= ', ';
			$stmtInsertValues .= "(
				'" . $battleId . "', '" . $arrAttackerUnit['ID_unit'] . "', '" . $this->_objSentGroup->getField('ID_place_owner') . "',
				'attack', '" . $arrAttackerUnit['amount'] . "', '" . (!empty($arrAttackerUnit['amount_died']) ? $arrAttackerUnit['amount_died'] : 0) . "'
			)";
		}
		return $stmtInsertValues;
	}
	
}
?>